/**
 * 享元模式
 * 结构型模式
 * 通过共享技术有效的支持对大量细粒度对象的复用。
 * 通过共享来减少创建的对象数量，避免大量类似的开销，提高系统资源的利用率
 * 使用享元模式的前提是需要创建大量类似的对象，为了实现共享对象，需要将这些类似对象的共同之处提取出来
 * 成为内部状态，
 *      内部状态：共享出来的信息，存储在享元信息内部，不随环境的改变而改变
 *      外部状态：对象得以依赖的标记，会随着环境的改变而改变
 *
 * 角色：
 *      1、抽象享元角色，所有具体享元类的基类，规范了需要实现的公共接口
 *      2、具体享元角色：实现抽象享元类的方法
 *      3、非享元角色：不可共享的外部状态
 *      4、享元工厂角色：负责创建和管理享元角色
 */
package com.fwzhang.second.flyweight;